import getpass
import os
from langchain_community.chat_message_histories import ChatMessageHistory
from fastapi import FastAPI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langserve import add_routes

os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "langchainDemo"
os.environ["LANGCHAIN_API_KEY"] = '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'

#聊天机器人案例
#1、创建大模型
model = ChatOpenAI(model='gpt-4o-mini')



# 定义提示模板
prompt_template = ChatPromptTemplate.from_messages([
    ('system','你是一个非常乐于助人的助手，请用{language}尽可能回答所有问题。'),
    MessagesPlaceholder(variable_name='my_msg')
])

#4、得到链
chain = prompt_template | model

#保存历史聊天记录
store = {} #所有用户的聊天记录都保存在store里。key:sessionId ，value：历史聊天记录对象

#此函数预期将接受一个session_id，并返回一个包含所有历史聊天记录对象
def get_session_history(session_id:str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()#创建一个空的历史聊天记录对象
    return store[session_id]

do_message = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='my_msg'#每次聊天的时候发送msg的key
)

config = {'configurable':{'session_id':'zs123'}}#给当前会话顶一个session_id

#第一轮聊天发出去的信息
resp = do_message.invoke(
    {
        'my_msg':[HumanMessage(content='你好，我是令狐！')],
        'language':'中文'
    },
    config=config
)

print(resp.content)

#第二轮聊天发出去的信息
resp = do_message.invoke(
    {
        'my_msg':[HumanMessage(content='请问我的名字是什么？')],
        'language':'中文'
    },
    config=config
)

print(resp.content)

#重新换一轮对话
config = {'configurable':{'session_id':'ls123'}}#给当前会话顶一个session_id
#第三轮聊天发出去的信息,每一次resp都是你一个token
for resp in do_message.stream(
    {
        'my_msg':[HumanMessage(content='请给我讲一个笑话')],
        'language':'English'
    },
    config=config
):
    print(resp.content,end='-')#每一次resp都是你一个token
